#pragma once
#include "RBTree.h"

namespace ky {

	template<class K>
	class set {
		struct KeyOfSet {
			const K& operator()(const K& key) {
				return key;
			}
		};

	public:
		typedef K key_type;
		typedef K value_type;

		typedef typename RBTree<key_type, value_type, KeyOfSet>::iterator iterator;

		iterator begin() {
			return _t.begin();
		}
		iterator end() {
			return _t.end();
		}

		pair<iterator, bool> insert(const value_type& k) {
			return _t.Insert(k);
		}


	private:
		RBTree<key_type, value_type, KeyOfSet> _t;
	};


	void test_set() {
		set<int> st;
		set<int>::iterator it = st.begin();
		while (it != st.end()) {
			cout << *it << " ";
			++it;
		}
		cout << endl;


		st.insert(1);
		st.insert(3);
		st.insert(5);
		st.insert(8);
		st.insert(2);
		st.insert(4);
		st.insert(6);
		st.insert(1);
		st.insert(1);

		for (auto i : st) {
			cout << i << " ";
		}
		cout << endl;
	}
}